home *** CD-ROM | disk | FTP | other *** search
- /*
- * neko for TownsOS
- *
- * Original = xneko by Masayuki Koba
- */
-
- #include "neko.h"
-
- #define TIMER 5
-
- /* 4bit color */
- #define WINDOW_WIDTH4 320 /* ウィンドウの幅 (ピクセル) */
- #define WINDOW_HEIGHT4 320 /* ウィンドウの高さ (ピクセル) */
- #define DEFAULT_WIN_X4 160 /* ウィンドウ生成X座標 */
- #define DEFAULT_WIN_Y4 100 /* ウィンドウ生成Y座標 */
- #define NEKO_SPEED4 16
- /* 16bit color */
- #define WINDOW_WIDTH16 200 /* ウィンドウの幅 (ピクセル) */
- #define WINDOW_HEIGHT16 180 /* ウィンドウの高さ (ピクセル) */
- #define DEFAULT_WIN_X16 60 /* ウィンドウ生成X座標 */
- #define DEFAULT_WIN_Y16 40 /* ウィンドウ生成Y座標 */
- #define NEKO_SPEED16 8
-
- #define MAX_TICK 9999 /* Odd Only! */
- #define IDLE_SPACE 6
-
- /* config */
- int timer = TIMER;
-
- int speed16 = NEKO_SPEED4;
- int x16 = DEFAULT_WIN_X4;
- int y16 = DEFAULT_WIN_Y4;
- int w16 = WINDOW_WIDTH4;
- int h16 = WINDOW_HEIGHT4;
- int frame16 = TRUE;
- int col16fc = FALSE;
- int col16_f = 1;
- int col16_c = FALSE;
- int col16_0 = 1;
- int col16_1 = 15;
- int col32k0 = 0x0000;
- int col32k1 = 0x7fff;
-
- int speed32k = NEKO_SPEED16;
- int x32k = DEFAULT_WIN_X16;
- int y32k = DEFAULT_WIN_Y16;
- int w32k = WINDOW_WIDTH16;
- int h32k = WINDOW_HEIGHT16;
- int frame32k = TRUE;
-
- /* 猫の状態定数 */
- #define NEKO_STOP 0 /* 立ち止まった */
- #define NEKO_JARE 1 /* 顔を洗っている */
- #define NEKO_KAKI 2 /* 頭を掻いている */
- #define NEKO_AKUBI 3 /* あくびをしている */
- #define NEKO_SLEEP 4 /* 寝てしまった */
- #define NEKO_AWAKE 5 /* 目が覚めた */
- #define NEKO_U_MOVE 6 /* 上に移動中 */
- #define NEKO_D_MOVE 7 /* 下に移動中 */
- #define NEKO_L_MOVE 8 /* 左に移動中 */
- #define NEKO_R_MOVE 9 /* 右に移動中 */
- #define NEKO_UL_MOVE 10 /* 左上に移動中 */
- #define NEKO_UR_MOVE 11 /* 右上に移動中 */
- #define NEKO_DL_MOVE 12 /* 左下に移動中 */
- #define NEKO_DR_MOVE 13 /* 右下に移動中 */
- #define NEKO_U_TOGI 14 /* 上の壁を引っ掻いている */
- #define NEKO_D_TOGI 15 /* 下の壁を引っ掻いている */
- #define NEKO_L_TOGI 16 /* 左の壁を引っ掻いている */
- #define NEKO_R_TOGI 17 /* 右の壁を引っ掻いている */
-
- /* 猫のアニメーション繰り返し回数 */
- #define NEKO_STOP_TIME 4
- #define NEKO_JARE_TIME 10
- #define NEKO_KAKI_TIME 4
- #define NEKO_AKUBI_TIME 3
- #define NEKO_AWAKE_TIME 3
- #define NEKO_TOGI_TIME 10
-
- #define SinPiPer8Times3 853 /* sin( 3π/8 )2×1000 */
- #define SinPiPer8 146 /* sin( π/8 )2×1000 */
-
- /*
- * グローバル変数
- */
- u_int BlackPixel, WhitePixel;
-
- int WindowWidth;
- int WindowHeight;
- int WindowPointX;
- int WindowPointY;
-
- int NekoTickCount; /* 猫動作カウンタ */
- int NekoStateCount; /* 猫同一状態カウンタ */
- int NekoState; /* 猫の状態 */
- int NekoX; /* 猫X座標 */
- int NekoY; /* 猫Y座標 */
- int NekoMoveDx; /* 猫移動距離X */
- int NekoMoveDy; /* 猫移動距離Y */
- int NekoLastX; /* 猫最終描画X座標 */
- int NekoLastY; /* 猫最終描画Y座標 */
- int NekoSpeed;
-
- int MouseX; /* マウスX座標 */
- int MouseY; /* マウスY座標 */
- int PrevMouseX = 0; /* 直前のマウスX座標 */
- int PrevMouseY = 0; /* 直前のマウスY座標 */
-
- /*
- * bitmaps
- */
- #define BITMAP_WIDTH 32 /* 1キャラクタの幅 (ピクセル) */
- #define BITMAP_HEIGHT 32 /* 1キャラクタの高さ (ピクセル) */
-
- u_char save[BITMAP_WIDTH*BITMAP_HEIGHT*sizeof (short)];
-
- #include "bitmaps/icon.xbm"
- #include "bitmaps/cursor.xbm"
- #include "bitmask/cursor.xbm"
-
- #include "bitmaps/space.xbm"
-
- #include "bitmaps/mati2.xbm"
- #include "bitmaps/jare2.xbm"
- #include "bitmaps/kaki1.xbm"
- #include "bitmaps/kaki2.xbm"
- #include "bitmaps/mati3.xbm"
- #include "bitmaps/sleep1.xbm"
- #include "bitmaps/sleep2.xbm"
-
- #include "bitmaps/awake.xbm"
-
- #include "bitmaps/up1.xbm"
- #include "bitmaps/up2.xbm"
- #include "bitmaps/down1.xbm"
- #include "bitmaps/down2.xbm"
- #include "bitmaps/left1.xbm"
- #include "bitmaps/left2.xbm"
- #include "bitmaps/right1.xbm"
- #include "bitmaps/right2.xbm"
- #include "bitmaps/upright1.xbm"
- #include "bitmaps/upright2.xbm"
- #include "bitmaps/upleft1.xbm"
- #include "bitmaps/upleft2.xbm"
- #include "bitmaps/dwleft1.xbm"
- #include "bitmaps/dwleft2.xbm"
- #include "bitmaps/dwright1.xbm"
- #include "bitmaps/dwright2.xbm"
-
- #include "bitmaps/utogi1.xbm"
- #include "bitmaps/utogi2.xbm"
- #include "bitmaps/dtogi1.xbm"
- #include "bitmaps/dtogi2.xbm"
- #include "bitmaps/ltogi1.xbm"
- #include "bitmaps/ltogi2.xbm"
- #include "bitmaps/rtogi1.xbm"
- #include "bitmaps/rtogi2.xbm"
-
-
- #include "bitmask/mati2.xbm"
- #include "bitmask/jare2.xbm"
- #include "bitmask/kaki1.xbm"
- #include "bitmask/kaki2.xbm"
- #include "bitmask/mati3.xbm"
- #include "bitmask/sleep1.xbm"
- #include "bitmask/sleep2.xbm"
-
- #include "bitmask/awake.xbm"
-
- #include "bitmask/up1.xbm"
- #include "bitmask/up2.xbm"
- #include "bitmask/down1.xbm"
- #include "bitmask/down2.xbm"
- #include "bitmask/left1.xbm"
- #include "bitmask/left2.xbm"
- #include "bitmask/right1.xbm"
- #include "bitmask/right2.xbm"
- #include "bitmask/upright1.xbm"
- #include "bitmask/upright2.xbm"
- #include "bitmask/upleft1.xbm"
- #include "bitmask/upleft2.xbm"
- #include "bitmask/dwleft1.xbm"
- #include "bitmask/dwleft2.xbm"
- #include "bitmask/dwright1.xbm"
- #include "bitmask/dwright2.xbm"
-
- #include "bitmask/utogi1.xbm"
- #include "bitmask/utogi2.xbm"
- #include "bitmask/dtogi1.xbm"
- #include "bitmask/dtogi2.xbm"
- #include "bitmask/ltogi1.xbm"
- #include "bitmask/ltogi2.xbm"
- #include "bitmask/rtogi1.xbm"
- #include "bitmask/rtogi2.xbm"
-
- BitmapData BitmapDataTable[] =
- {
- /* 0*/{ space_bits, space_bits, space_width, space_height },
- /* 1*/{ mati2_bits, mati2_mask_bits, mati2_width, mati2_height },
- /* 2*/{ jare2_bits, jare2_mask_bits, jare2_width, jare2_height },
- /* 3*/{ kaki1_bits, kaki1_mask_bits, kaki1_width, kaki1_height },
- /* 4*/{ kaki2_bits, kaki2_mask_bits, kaki2_width, kaki2_height },
- /* 5*/{ mati3_bits, mati3_mask_bits, mati3_width, mati3_height },
- /* 6*/{ sleep1_bits, sleep1_mask_bits, sleep1_width, sleep1_height },
- /* 7*/{ sleep2_bits, sleep2_mask_bits, sleep2_width, sleep2_height },
- /* 8*/{ awake_bits, awake_mask_bits, awake_width, awake_height },
- /* 9*/{ up1_bits, up1_mask_bits, up1_width, up1_height },
- /*10*/{ up2_bits, up2_mask_bits, up2_width, up2_height },
- /*11*/{ down1_bits, down1_mask_bits, down1_width, down1_height },
- /*12*/{ down2_bits, down2_mask_bits, down2_width, down2_height },
- /*13*/{ left1_bits, left1_mask_bits, left1_width, left1_height },
- /*14*/{ left2_bits, left2_mask_bits, left2_width, left2_height },
- /*15*/{ right1_bits, right1_mask_bits, right1_width, right1_height },
- /*16*/{ right2_bits, right2_mask_bits, right2_width, right2_height },
- /*17*/{ upleft1_bits, upleft1_mask_bits, upleft1_width, upleft1_height },
- /*18*/{ upleft2_bits, upleft2_mask_bits, upleft2_width, upleft2_height },
- /*19*/{ upright1_bits, upright1_mask_bits, upright1_width, upright1_height },
- /*20*/{ upright2_bits, upright2_mask_bits, upright2_width, upright2_height },
- /*21*/{ dwleft1_bits, dwleft1_mask_bits, dwleft1_width, dwleft1_height },
- /*22*/{ dwleft2_bits, dwleft2_mask_bits, dwleft2_width, dwleft2_height },
- /*23*/{ dwright1_bits, dwright1_mask_bits, dwright1_width, dwright1_height },
- /*24*/{ dwright2_bits, dwright2_mask_bits, dwright2_width, dwright2_height },
- /*25*/{ utogi1_bits, utogi1_mask_bits, utogi1_width, utogi1_height },
- /*26*/{ utogi2_bits, utogi2_mask_bits, utogi2_width, utogi2_height },
- /*27*/{ dtogi1_bits, dtogi1_mask_bits, dtogi1_width, dtogi1_height },
- /*28*/{ dtogi2_bits, dtogi2_mask_bits, dtogi2_width, dtogi2_height },
- /*29*/{ ltogi1_bits, ltogi1_mask_bits, ltogi1_width, ltogi1_height },
- /*30*/{ ltogi2_bits, ltogi2_mask_bits, ltogi2_width, ltogi2_height },
- /*31*/{ rtogi1_bits, rtogi1_mask_bits, rtogi1_width, rtogi1_height },
- /*32*/{ rtogi2_bits, rtogi2_mask_bits, rtogi2_width, rtogi2_height },
- };
-
- typedef struct {
- int TickEven;
- int TickOdd;
- } Animation;
-
- Animation AnimationPattern[] =
- {
- { 1, 1 }, /* NekoState == NEKO_STOP */
- { 2, 1 }, /* NekoState == NEKO_JARE */
- { 3, 4 }, /* NekoState == NEKO_KAKI */
- { 5, 5 }, /* NekoState == NEKO_AKUBI */
- { 6, 7 }, /* NekoState == NEKO_SLEEP */
- { 8, 8 }, /* NekoState == NEKO_AWAKE */
- { 9, 10 }, /* NekoState == NEKO_U_MOVE */
- { 11, 12 }, /* NekoState == NEKO_D_MOVE */
- { 13, 14 }, /* NekoState == NEKO_L_MOVE */
- { 15, 16 }, /* NekoState == NEKO_R_MOVE */
- { 17, 18 }, /* NekoState == NEKO_UL_MOVE */
- { 19, 20 }, /* NekoState == NEKO_UR_MOVE */
- { 21, 22 }, /* NekoState == NEKO_DL_MOVE */
- { 23, 24 }, /* NekoState == NEKO_DR_MOVE */
- { 25, 26 }, /* NekoState == NEKO_U_TOGI */
- { 27, 28 }, /* NekoState == NEKO_D_TOGI */
- { 29, 30 }, /* NekoState == NEKO_L_TOGI */
- { 31, 32 }, /* NekoState == NEKO_R_TOGI */
- };
-
- struct window win, frame_win[4];
- int f_win = FALSE;
- int neko_win = FALSE;
- int neko_first = TRUE;
- int neko_count = 1;
- u_char frame_save[4][1024];
-
- void nekomain()
- {
- int i;
- extern int aplid, active, restart, unmapped;
- extern short vramseg;
- extern int pixel, dwidth, vheight;
- extern short _col32k0[], _col32k1[];
- extern void NekoThinkDraw(), SetNekoState();
- extern void DrawWindow4(), DrawWindow16(), FindBlackWhite();
- extern void draw16(), draw4(), draw4f(), draw16f();
- extern void map();
- extern int _setfs();
-
- if (!active)
- return;
-
- /* speed control timer */
- if (--neko_count > 0)
- return;
- neko_count = timer;
-
- _setfs(vramseg);
- if (restart){
- restart = FALSE;
- /* make Frame */
- if (pixel == 4){ /* 4bit-color */
- if (dwidth < 1024){ /* MR */
- WindowPointX = x16;
- WindowWidth = w16;
- } else {
- WindowPointX = x16 + (x16 >> 1); /* x 1.5 */
- WindowWidth = w16 + (w16 >> 1);
- }
- if (vheight < 1024){
- WindowPointY = y16;
- WindowHeight = h16;
- } else {
- WindowPointY = y16 + (y16 >> 1);
- WindowHeight = h16 + (h16 >> 1);
- }
- NekoSpeed = speed16;
- FindBlackWhite(TRUE);
- if (!col16_c){
- col16_0 = BlackPixel;
- col16_1 = WhitePixel;
- }
- if (!col16fc)
- col16_f = BlackPixel;
- col16_0 |= col16_0 << 4;
- col16_1 |= col16_1 << 4;
- col16_f |= col16_f << 4;
- for (i = 0; i < 4; i++){
- frame_win[i].draw = draw4f;
- frame_win[i].size = WindowHeight;
- }
- win.draw = draw4;
- win.size = BITMAP_WIDTH*BITMAP_HEIGHT;
- } else if (pixel == 16){ /* 15bit-color */
- if (dwidth < 512){ /* MR */
- WindowPointX = x32k;
- WindowWidth = w32k;
- } else {
- WindowPointX = x32k + (x32k >> 1);
- WindowWidth = w32k + (w32k >> 1);
- }
- if (vheight < 512){
- WindowPointY = y32k;
- WindowHeight = h32k;
- } else {
- WindowPointY = y32k + (y32k >> 1);
- WindowHeight = h32k + (h32k >> 1);
- }
- NekoSpeed = speed32k;
- *_col32k0 = col32k0;
- *_col32k1 = col32k1;
- frame_win[0].draw = frame_win[1].draw = draw16f;
- frame_win[2].draw = frame_win[3].draw = draw16f;
- frame_win[0].size = frame_win[1].size = WindowHeight*sizeof(short);
- frame_win[2].size = frame_win[3].size = WindowWidth*sizeof(short);
- win.draw = draw16;
- win.size = BITMAP_WIDTH*BITMAP_HEIGHT*sizeof (short);
- } else
- return;
-
- /* 猫の初期化 */
- NekoX = ( WindowWidth - BITMAP_WIDTH / 2 ) / 2;
- NekoY = ( WindowHeight - BITMAP_HEIGHT / 2 ) / 2;
- NekoLastX = NekoX;
- NekoLastY = NekoY;
- SetNekoState( NEKO_STOP );
-
- win.x = WindowPointX + NekoX;
- win.y = WindowPointY + NekoY;
- win.w = BITMAP_WIDTH;
- win.h = BITMAP_HEIGHT;
- win.save = save;
- win.owner = NULL;
- win.aplid = aplid;
- win.mapped = FALSE;
- frame_win[0].x = frame_win[2].x = frame_win[3].x = WindowPointX;
- frame_win[1].x = WindowPointX + WindowWidth;
- frame_win[0].y = frame_win[1].y = frame_win[2].y = WindowPointY;
- frame_win[3].y = WindowPointY + WindowHeight;
- frame_win[0].w = frame_win[1].w = 1;
- frame_win[2].w = frame_win[3].w = WindowWidth;
- frame_win[0].h = frame_win[1].h = WindowHeight;
- frame_win[2].h = frame_win[3].h = 1;
- for (i = 0; i < 4; i++){
- frame_win[i].save = frame_save[i];
- frame_win[i].owner = NULL;
- frame_win[i].aplid = aplid;
- frame_win[i].mapped = FALSE;
- }
- if (neko_first){
- neko_first = FALSE;
- winCreate(&win);
- if ((pixel == 4 && frame16) || (pixel == 16 && frame32k)){
- f_win = TRUE;
- for (i = 0; i < 4; i++){
- winCreate(&frame_win[i]);
- winLower(&frame_win[i]);
- }
- }
- neko_win = TRUE;
- }
- map(TRUE);
- }
- if (unmapped)
- map(TRUE);
-
- NekoThinkDraw();
- }
-
- void map(int map)
- {
- int i;
- extern int unmapped;
-
- if (map){
- if (neko_win)
- winMap(&win);
- if (f_win){
- for (i = 0; i < 4; i++)
- winMap(&frame_win[i]);
- }
- } else {
- if (neko_win)
- winUnmap(&win);
- if (f_win){
- for (i = 0; i < 4; i++)
- winUnmap(&frame_win[i]);
- }
- }
- unmapped = !map;
- }
-
- void terminate()
- {
- int i;
-
- if (neko_win){
- winUnmap(&win);
- winDestroy(&win);
- neko_win = FALSE;
- }
- if (f_win){
- for (i = 0; i < 4; i++){
- winUnmap(&frame_win[i]);
- winDestroy(&frame_win[i]);
- }
- f_win = FALSE;
- }
- }
-
- /*--------------------------------------------------------------
- *
- * 動作解析猫描画処理
- *
- *--------------------------------------------------------------*/
- void
- NekoThinkDraw()
- {
- extern void CalcDxDy(), DrawNeko(), TickCount(), SetNekoState();
- extern void NekoDirection();
- extern int IsNekoMoveStart(), IsWindowOver(), IsNekoDontMove();
-
- CalcDxDy();
-
- if ( NekoState != NEKO_SLEEP ) {
- DrawNeko( NekoX, NekoY,
- NekoTickCount % 2 == 0 ?
- AnimationPattern[ NekoState ].TickEven :
- AnimationPattern[ NekoState ].TickOdd );
- } else {
- DrawNeko( NekoX, NekoY,
- NekoTickCount % 8 <= 3 ?
- AnimationPattern[ NekoState ].TickEven :
- AnimationPattern[ NekoState ].TickOdd );
- }
-
- TickCount();
-
- switch ( NekoState ) {
- case NEKO_STOP:
- if ( IsNekoMoveStart() ) {
- SetNekoState( NEKO_AWAKE );
- break;
- }
- if ( NekoStateCount < NEKO_STOP_TIME ) {
- break;
- }
- if ( NekoMoveDx < 0 && NekoX <= 0 ) {
- SetNekoState( NEKO_L_TOGI );
- } else if ( NekoMoveDx > 0 && NekoX >= WindowWidth - BITMAP_WIDTH ) {
- SetNekoState( NEKO_R_TOGI );
- } else if ( NekoMoveDy < 0 && NekoY <= 0 ) {
- SetNekoState( NEKO_U_TOGI );
- } else if ( NekoMoveDy > 0 && NekoY >= WindowHeight - BITMAP_HEIGHT ) {
- SetNekoState( NEKO_D_TOGI );
- } else {
- SetNekoState( NEKO_JARE );
- }
- break;
- case NEKO_JARE:
- if ( IsNekoMoveStart() ) {
- SetNekoState( NEKO_AWAKE );
- break;
- }
- if ( NekoStateCount < NEKO_JARE_TIME ) {
- break;
- }
- SetNekoState( NEKO_KAKI );
- break;
- case NEKO_KAKI:
- if ( IsNekoMoveStart() ) {
- SetNekoState( NEKO_AWAKE );
- break;
- }
- if ( NekoStateCount < NEKO_KAKI_TIME ) {
- break;
- }
- SetNekoState( NEKO_AKUBI );
- break;
- case NEKO_AKUBI:
- if ( IsNekoMoveStart() ) {
- SetNekoState( NEKO_AWAKE );
- break;
- }
- if ( NekoStateCount < NEKO_AKUBI_TIME ) {
- break;
- }
- SetNekoState( NEKO_SLEEP );
- break;
- case NEKO_SLEEP:
- if ( IsNekoMoveStart() ) {
- SetNekoState( NEKO_AWAKE );
- break;
- }
- break;
- case NEKO_AWAKE:
- if ( NekoStateCount < NEKO_AWAKE_TIME ) {
- break;
- }
- NekoDirection(); /* 猫が動く向きを求める */
- break;
- case NEKO_U_MOVE:
- case NEKO_D_MOVE:
- case NEKO_L_MOVE:
- case NEKO_R_MOVE:
- case NEKO_UL_MOVE:
- case NEKO_UR_MOVE:
- case NEKO_DL_MOVE:
- case NEKO_DR_MOVE:
- NekoX += NekoMoveDx;
- NekoY += NekoMoveDy;
- NekoDirection();
- if ( IsWindowOver() ) {
- if ( IsNekoDontMove() ) {
- SetNekoState( NEKO_STOP );
- }
- }
- break;
- case NEKO_U_TOGI:
- case NEKO_D_TOGI:
- case NEKO_L_TOGI:
- case NEKO_R_TOGI:
- if ( IsNekoMoveStart() ) {
- SetNekoState( NEKO_AWAKE );
- break;
- }
- if ( NekoStateCount < NEKO_TOGI_TIME ) {
- break;
- }
- SetNekoState( NEKO_KAKI );
- break;
- default:
- /* Internal Error */
- SetNekoState( NEKO_STOP );
- break;
- }
- }
-
- /*--------------------------------------------------------------
- *
- * 猫移動 dx, dy 計算
- *
- *--------------------------------------------------------------*/
- void
- CalcDxDy()
- {
- short x, y;
- int LargeX, LargeY;
- extern int pixel;
- extern void _mousepos();
-
- PrevMouseX = MouseX;
- PrevMouseY = MouseY;
-
- _mousepos(&x, &y);
- if (pixel == 16){
- x >>= 1;
- y >>= 1;
- }
- MouseX = x - WindowPointX;
- MouseY = y - WindowPointY;
-
- LargeX = MouseX - (NekoX + BITMAP_WIDTH / 2);
- LargeY = MouseY - (NekoY + BITMAP_HEIGHT / 2);
-
- if (LargeX >= 0)
- NekoMoveDx = (LargeX < NekoSpeed) ? LargeX : NekoSpeed;
- else
- NekoMoveDx = (-NekoSpeed < LargeX) ? LargeX : -NekoSpeed;
- if (LargeY >= 0)
- NekoMoveDy = (LargeY < NekoSpeed) ? LargeY : NekoSpeed;
- else
- NekoMoveDy = (-NekoSpeed < LargeY) ? LargeY : -NekoSpeed;
- }
-
- /*--------------------------------------------------------------
- *
- * ティックカウント処理
- *
- *--------------------------------------------------------------*/
- void
- TickCount()
- {
- if ( ++NekoTickCount >= MAX_TICK ) {
- NekoTickCount = 0;
- }
-
- if ( NekoTickCount % 2 == 0 ) {
- if ( NekoStateCount < MAX_TICK ) {
- NekoStateCount++;
- }
- }
- }
-
- /*--------------------------------------------------------------
- *
- * 猫状態設定
- *
- *--------------------------------------------------------------*/
- void
- SetNekoState(int SetValue)
- {
- NekoTickCount = 0;
- NekoStateCount = 0;
-
- NekoState = SetValue;
- }
-
-
- /*--------------------------------------------------------------
- *
- * 猫移動方法決定
- *
- *--------------------------------------------------------------*/
- void
- NekoDirection()
- {
- int NewState;
- int LargeX, LargeY, LargeY2;
- int Length2;
- int SinTheta2;
-
- if (NekoMoveDx == 0 && NekoMoveDy == 0){
- NewState = NEKO_STOP;
- } else {
- LargeX = NekoMoveDx;
- LargeY = -NekoMoveDy;
- LargeY2 = LargeY * LargeY * 1000;
- if (LargeY < 0)
- LargeY2 = -LargeY2;
- Length2 = LargeX * LargeX + LargeY * LargeY;
- SinTheta2 = LargeY2 / Length2;
-
- if (NekoMoveDx > 0){
- if (SinTheta2 > SinPiPer8Times3){
- NewState = NEKO_U_MOVE;
- } else if ((SinTheta2 <= SinPiPer8Times3)
- && (SinTheta2 > SinPiPer8)){
- NewState = NEKO_UR_MOVE;
- } else if ((SinTheta2 <= SinPiPer8)
- && (SinTheta2 > -(SinPiPer8))){
- NewState = NEKO_R_MOVE;
- } else if ((SinTheta2 <= -(SinPiPer8))
- && (SinTheta2 > -(SinPiPer8Times3))){
- NewState = NEKO_DR_MOVE;
- } else {
- NewState = NEKO_D_MOVE;
- }
- } else {
- if (SinTheta2 > SinPiPer8Times3){
- NewState = NEKO_U_MOVE;
- } else if ((SinTheta2 <= SinPiPer8Times3)
- && (SinTheta2 > SinPiPer8)){
- NewState = NEKO_UL_MOVE;
- } else if ((SinTheta2 <= SinPiPer8)
- && (SinTheta2 > -(SinPiPer8))){
- NewState = NEKO_L_MOVE;
- } else if ((SinTheta2 <= -(SinPiPer8))
- && (SinTheta2 > -(SinPiPer8Times3))){
- NewState = NEKO_DL_MOVE;
- } else {
- NewState = NEKO_D_MOVE;
- }
- }
- }
-
- if (NekoState != NewState){
- SetNekoState( NewState );
- }
- }
-
-
- /*--------------------------------------------------------------
- *
- * 猫壁ぶつかり判定
- *
- *--------------------------------------------------------------*/
- IsWindowOver()
- {
- int ReturnValue = FALSE;
-
- if ( NekoY <= 0 ) {
- NekoY = 0;
- ReturnValue = TRUE;
- } else if ( NekoY >= WindowHeight - BITMAP_HEIGHT ) {
- NekoY = WindowHeight - BITMAP_HEIGHT;
- ReturnValue = TRUE;
- }
- if ( NekoX <= 0 ) {
- NekoX = 0;
- ReturnValue = TRUE;
- } else if ( NekoX >= WindowWidth - BITMAP_WIDTH ) {
- NekoX = WindowWidth - BITMAP_WIDTH;
- ReturnValue = TRUE;
- }
-
- return( ReturnValue );
- }
-
-
- /*--------------------------------------------------------------
- *
- * 猫移動状況判定
- *
- *--------------------------------------------------------------*/
- IsNekoDontMove()
- {
- if ( NekoX == NekoLastX && NekoY == NekoLastY ) {
- return( TRUE );
- } else {
- return( FALSE );
- }
- }
-
-
- /*--------------------------------------------------------------
- *
- * 猫移動開始判定
- *
- *--------------------------------------------------------------*/
- IsNekoMoveStart()
- {
- if ( ( PrevMouseX >= MouseX - IDLE_SPACE
- && PrevMouseX <= MouseX + IDLE_SPACE ) &&
- ( PrevMouseY >= MouseY - IDLE_SPACE
- && PrevMouseY <= MouseY + IDLE_SPACE ) ) {
- return( FALSE );
- } else {
- return( TRUE );
- }
- }
-
- /*--------------------------------------------------------------
- *
- * 猫描画処理
- *
- *--------------------------------------------------------------*/
- int neko_id;
-
- void
- DrawNeko(int x, int y, int id)
- {
- neko_id = id;
- if (x != NekoLastX || y != NekoLastY){
- winMove(&win, WindowPointX + x, WindowPointY + y);
- } else {
- winUpdate(&win);
- }
- NekoLastX = x;
- NekoLastY = y;
- }
-
- struct cell {
- int index;
- u_char color[4];
- };
-
- struct colorPallet {
- int n_color;
- struct cell cells[16];
- };
-
- void FindBlackWhite(int tiff)
- {
- struct colorPallet pallet;
- int dark, blight, y;
- u_int n;
- extern void _getpallet();
-
- _getpallet(&pallet);
- dark = 100000; blight = -1;
- n= (tiff) ? 0 : 1;
- for (; n < 16; n++){
- y = (pallet.cells[n].color[0] & 0xf0)
- + (pallet.cells[n].color[1] & 0xf0)
- + (pallet.cells[n].color[2] & 0xf0);
- if (y < dark){
- dark =y;
- BlackPixel = n;
- }
- if (y > blight){
- blight = y;
- WhitePixel = n;
- }
- }
- }
-